/**
 * Clase para filtrar y actualizar el contenido de las personas 
 */ 
qx.Class.define("mutual.filterPersonas", {
			extend : mutual.filter,
			/**
			 * Se dispara cuando se borra una persona desde el abm de personas
			 */
			events : {
				"borrado" : "qx.event.type.Event"
			},
			/** 
			 * @param (int) maxDisplay: Máximo nº de registros a sugerir en la búsqueda
			 * @param (delegate) fnSelected: Puntero a la función ejecute luego de cambiar el contenido de la búsqueda
			 * @param (delegate) fnLoadFilter: Puntero a la función que realiza la carga del combo
			 */
			construct : function(maxDisplay, fnSelected, fnLoadFilter) {
				this.maxDisplay = maxDisplay;
				this.fnSelected = fnSelected;
				this.base(arguments);
				this.setLayout(new qx.ui.layout.HBox(5));
				// cargamos las personas en el json
				var personas = (fnLoadFilter) ? fnLoadFilter() : this.getPersonas();
				if (!personas){
					personas = this.getPersonas();
				}
				this.loadJson(personas);
				this.loadCombo();
				
				// Definimos el botón que dispará el abm de personas
				var btnAbmPersonas = new qx.ui.form.Button("","mutual/newPersona.png").set({width: 17});
				btnAbmPersonas.addListener("execute", function(){
					var win = this.getModalWindow("Abm de Personas");
					var abmPersonas = this.getAbmPersonas(win, this);
					win.add(abmPersonas);
					win.open();
				}, this)
				
				// seteamos el puntero a la función que ejecutará cuando cambie el contenido de la búsqueda
				this.combo.addListener("changeValue", function(e){
					if (this.fnSelected)
						this.fnSelected();
				}, this)	
				
				// Agregamos los componentes al filtro
				var lblPersonas = new qx.ui.basic.Label("Persona");
				this.add(lblPersonas);
				this.add(this.combo);
				this.add(btnAbmPersonas);
			},
			
			members : {
				json : null,
				maxDisplay : null,
				
				reload : function(){
					var personas = this.getPersonas();
					this.loadJson(personas);
					this.loadCombo();
				},
				/**
				 * carga el json que cargará el combo
				 * 
				 * @param (Array) personas
				 */
				loadJson : function(personas){
					if (personas) {
						this.json = null;
						this.json = new Array();
						for (var i=0; i < personas.length; i++){
						this.json[i] = {
									idPersona: parseInt(personas[i].id_persona),
									apenom: personas[i].apellido + ", " + personas[i].nombre, 
									dni: personas[i].dni
								  };
						}
					}
				},
				
				/**
				 * carga el combo con el json que se cargó previamente
				 */
				loadCombo : function(){
					// ComboBox
					if (!this.combo){
						this.combo = new qx.ui.form.ComboBox();
						this.combo.setWidth(250);
					}
					this.combo.getChildControl("textfield").addListener("input",
						function(e) {
							this.combo.getChildControl("list").removeAll();

							if (e.getData() !== "") {
								var find = new RegExp(e.getData(), "i");
								var j = 0;
								for (var i = 0; i < this.json.length; i++) {
									if ((this.json[i].dni.toString().search(find) != -1) || // Busca en la parte de Dni
										(this.json[i].apenom.toString().search(find) != -1)) { // Busca en la parte de Nombre
										this.combo.add(new qx.ui.form.ListItem(
												this.json[i].apenom, "",
												this.json[i].idPersona));
										j++;
									}
									if (j == this.maxDisplay)
										break;
								}
								this.combo.open();
								find = null;
							}
						}, this);
				},
				/**
				 * Obtiene un array con las personas solicitadas al server
				 * 
				 * @return (Array) personas
				 */
				getPersonas : function() {
					var rpc = new qx.io.remote.Rpc("services/", "mutual.Persona");
					var personas = rpc.callSync("getPersonas");
					return personas;
				},
				/**
				 * Muestra en el combo la localidad especificada 
				 * 
				 * @param (int) idPersona: Id de person que se desea mostrar en el combo
				 */
				setPersona : function(idPersona){
					 if (idPersona) { 
		                for(var i in this.json) { 
		                    if (this.json[i].idPersona === idPersona) { 
		                        this.combo.getChildControl("list").removeAll(); 
		                        this.combo.add(new qx.ui.form.ListItem(this.json[i].apenom, "", this.json[i].idPersona)); 
		                        break; 
		                    }
		                }
		                this.combo.getChildControl("list").setModelSelection([idPersona]);
		            } else {
		                this.combo.getChildControl("textfield").setValue(idPersona);
		                this.combo.getChildControl("list").resetSelection();
		            }
				}, 
				/**
				 * Obtiene la persona especificada
				 * 
				 * @param (int) idPersona: Id de persona que se desea recuperar
				 * 
				 * @return (json object) persona
				 */	
				getPersona : function (idPersona){
					var rpc = new qx.io.remote.Rpc("services/","mutual.Persona");
					var persona = rpc.callSync("getPersona", idPersona);
					return persona;
				},
				/**
				 * Obtiene el abm de personas
				 * 
				 * @param (qx.ui.window.Window) win: ventana sobre la que se cargará el abm
				 * @param (mutual.filterPersonas) filterPersonas: filtro de personas
				 * 
				 * @return (mutual.abm) devuelve el abm de personas
				 */	
				getAbmPersonas : function(win, filterPersonas){
					/* _______________________ ABM PERSONAS _______________________ */
						// cargamos el modelo del grid
						var model = { 
							fields : ["id", "Nro Control", "Nombre", "Apellido"], 
							titles : ["id_persona","nro_control1", "nombre", "apellido"]
						}
								
						// cargamos los criterios de busqueda
						var dataFindCriteria = {
							names : (["Buscar por Nombre", "Buscar por Apellido",
									"Buscar por Dni"]),
							operators : (["like", "like", "="]),
							values : (["nombre", "apellido", "dni"])
						}
						// inicializamos el form
						var abmPersonas = new mutual.abm(model, function(criteria) {
									var param = {
										criteria : criteria
									}
									var rpc = new qx.io.remote.Rpc("services/","mutual.Persona");
									var personas = rpc.callSync("getPersonas",param);
									return personas;
								}, dataFindCriteria);
	
						// seteamos los eventos que se disparan con las acciones del
						abmPersonas.initForm = function(nuevo) {
							var frm = null;
							if (nuevo) {
								frm = new mutual.formPersona();
							} else {
								var idPersona = abmPersonas.getSelectedId();
								if (!idPersona){
									alert("Debe seleccionar una persona");
									return;
								}
								frm = new mutual.formPersona(idPersona);
							}
							abmPersonas.hide();
							frm.setWidth(300);
							// se dispara una vez que se persisten los datos del
							frm.persistSuccess = function() {
								abmPersonas.loadGrid();
								abmPersonas.show();
								filterPersonas.reload();
							};
							frm.addListener("cancelar", function() {
										abmPersonas.show();
							}, this);
							this.add(frm);
						};
	
						abmPersonas.deleteAction = function() {
							var idPersona = this.getSelectedId();
							if (!idPersona){
									alert("Debe seleccionar una persona");
									return;
							}
							if (!confirm("Esta seguro que desea borrar este registro?")) {
								return;
							}
							var rpc = new qx.io.remote.Rpc("services/", "mutual.Persona");
							var response = rpc.callSync("deletePersona", idPersona);
							abmPersonas.loadGrid();
							
							var idPersonaEnFiltro = filterPersonas.getSelectedEntity().value;
							if (idPersona == idPersonaEnFiltro){
								filterPersonas.clearValue();
							}
							filterPersonas.fireEvent("borrado");
							filterPersonas.reload();
						};
						
						abmPersonas.tblGrid.addListener("cellDblclick",function(){
							var idPersona = parseInt(abmPersonas.getSelectedId());
							filterPersonas.setPersona(idPersona);
							win.close();
						},this)
						
						abmPersonas.tblGrid.getTableColumnModel().setColumnVisible(0, false);
						abmPersonas.tblGrid.setHeight(250);
						return abmPersonas;
				},
				
				/**
				 * Obtiene una ventana
				 * 
				 * @param (string) title: título que se desea mostrar en la ventana
				 * 
				 * @return (qx.ui.window.Window) Ventana
				 */	
				getModalWindow : function(title){
					 var win = new qx.ui.window.Window((title)? title : "");
					 win.setLayout(new qx.ui.layout.VBox(5));
					 win.setModal(true);
					 win.setShowMinimize(false);
					 win.addListener("resize",function(){
						win.center();
					 }, win);
					 return win;
			    }
			}
});
